'''
Created on 24 fevr. 2011

@author: paraita
'''

import wave        #http://docs.python.org/library/wave.html
import struct
import Bruiteur
import os
from alsaaudio import *
import audioop

class Piano():
    '''
    joue une liste de (note, duree) qui serra analysee
    ensuite on peut demander au piano de jouer l'air
    '''
    musique = []
    partition =()
    fichierAudio = ""
    freq = { 'do' : 261,
             're' : 294,
             'mi' : 331,
             'fa' : 348,
             'sol': 392,
             'la' : 441,
             'si' : 496,
             'od' : 523
            }
    
    def __init__(self, partition, fichierAudio):
        self.partition = partition
        self.fichierAudio = fichierAudio
        
    def processPartition(self):
        '''
        a partir de la partition on va creer la musique
        '''
        listeNotes = []
        cnt_note = 0
        # la je cree toutes les notes de la partition
        for (note, duree) in self.partition:
            fichierNoteCourante = Bruiteur.Bruiteur(frequence=self.freq[note], taille=int(duree*10000), nomFichier="temp-" + str(cnt_note) + "-" + note + ".wav").createAudio()
            listeNotes.append(fichierNoteCourante.getNomFichier())
            cnt_note = cnt_note + 1
        
        musique = []
        width = 0
        totalWidth = 0
        framerate = 0
        # je write dans le fichier
        for note in listeNotes:
            signal = wave.open(note, 'r')
            width = signal.getsampwidth()
            totalWidth = totalWidth + width
            print "width d'une note: ",width
            framerate = signal.getframerate()
            frame = signal.readframes(1)
            while len(frame):
                musique.append(frame)
                frame = signal.readframes(1)
                musique.append(frame)
            signal.close()
            os.remove(note)
        
        
        print "totalWidth:",totalWidth
        print "taille musique",len(musique)
        # la je dois ecrire le array musique dans un fichier wav !
        new_signal = wave.open(self.fichierAudio, 'w')
        new_signal.setsampwidth(width)
        new_signal.setframerate(framerate)
        new_signal.setnchannels(2)
        
        print "taille musique",len(musique)
        for i in range(len(musique)):
            new_signal.writeframes(musique[i])
        new_signal.close()
        
        self.musique = musique
        
        return self
    
    def jouerPartition(self):
        
        aLire = wave.open(self.fichierAudio, 'r')
        out = PCM(type=PCM_PLAYBACK, mode=PCM_NORMAL, card='default')
        
        out.setchannels(aLire.getnchannels())
        out.setformat(PCM_FORMAT_S32_LE)
        out.setrate(aLire.getframerate())
        
        chunk = aLire.readframes(2)
        while chunk != "":
            out.write(chunk)
            chunk = aLire.readframes(2)
        out.close()
        aLire.close()
        
        return self
        
        
        
        

        
        
            
            
            
            
            
            
            
            
            
        
            
        